unit u_load;

interface

uses
  sysutils;

type

    t_contenu = record
      nom: string;
      _type: string;
      carac1: integer;
      carac2: integer;
      quantite: integer;
      equip: boolean;
      mesh: string;
    end;

    t_tab_cont = array of t_contenu;

    objet_map = record
      rotation : integer;//la rotation pour le jeu...
      x,y : integer;//taille sur la map en nombre de case
      mesh : string;
      _type : string;
      nom : string;
      numobj : integer;//trés important pour lier les objets entre eux!!
      taille : integer;//Ram
      capacite : integer;//disque dur
      puissance : integer;//Carte graphique
      vitesse : integer;//Processeur
      portee : integer;//Armes
      degat : integer;//Armes et piege
      quantite : integer;//Argent
      etage : integer;//Ascenceur
      text : string;//Livre
      script : string;//Gentil petit asus ou boss
      niveau : integer;//[1..100] tous types ennemis ou boss
      contenu : t_contenu;//objet à la mort de l'ennemi ou coffre ou boss
      //ouvert : boolean pour le jeu pour savoir si la porte est ouverte ou fermée.
  end;

  T_Map = Array of Array of Array of objet_map;

  t_coordo = record
    x: integer;
    y: integer;
    num: integer;
  end;

  t_object = record
    objet : objet_map;
    tab_etage : array of t_coordo;
  end;

  T_eta_obj = array of t_object;

  t_map_obj = array of T_eta_obj;

function load_map( var map : T_map;
                   var taillex : integer;
                   var tailley : integer;
                   var nbretage : integer;
                   var nbrobj : integer;
                   var dep_etage : integer;
                   var dep_x: integer;
                   var dep_y: integer;
                   path : string;
                   game_type: char ): boolean;

function tri_map(map: t_map;
                 taillex: integer;
                 tailley: integer;
                 nbetage: integer;
                 dep_etage: integer;
                 nbrobj: integer): t_map_obj;

function tri_etage_stat(map: T_Map;
                        etage: integer;
                        taillex: integer;
                        tailley: integer;
                        nbrobj: integer): T_eta_obj;

//function tri_etage_dyna(map: T_Map;
//                        etage: integer;
//                        taillex: integer;
//                        tailley: integer;
//                        nb_obj_dyn: integer): T_eta_obj;

implementation

uses u_mesh,
     u_engine;

function load_map( var map : T_map;
                   var taillex : integer;
                   var tailley : integer;
                   var nbretage : integer;
                   var nbrobj : integer;
                   var dep_etage : integer;
                   var dep_x: integer;
                   var dep_y: integer;
                   path : string;
                   game_type : char ): boolean;
var
  fichier : TextFile;
  buf : string;
  i, j, k : integer;
  begin
    try
      AssignFile(fichier, path);
      Reset(fichier);
      Readln(fichier, buf);
      taillex := StrToInt(buf);
      Readln(fichier, buf);
      tailley := StrToInt(buf);
      Readln(fichier, buf);
      nbretage := StrToInt(buf);
      Readln(fichier, buf);
      nbrobj := StrToInt(buf);
      SetLength(map, nbretage + 1, taillex, tailley);
      for k := 0 to nbretage do
       for i := 0 to taillex - 1 do
        for j := 0 to tailley - 1 do

            begin
              Readln(fichier, buf);
              if buf = 'Depart' then
                begin
                  dep_etage := k;
                  dep_x := j;
                  dep_y := i;
//                  myplayer.player_goto(j, i);
                end;
              map[k, i, j]._type := buf;

              if buf <> 'none' then
                begin
                  Readln(fichier, buf);
                  map[k, i, j].nom := buf;
                  Readln(fichier, buf);
                  map[k, i, j].numobj := StrToInt(buf);
                  Readln(fichier, buf);
                  map[k, i, j].mesh := buf;
                  Readln(fichier, buf);
                  map[k, i, j].x := StrToInt(buf);
                  Readln(fichier, buf);
                  map[k, i, j].y := StrToInt(buf);
                  if map[k, i, j]._type = 'Argent' then
                    begin
                      Readln(fichier, buf);
                      map[k, i, j].quantite := StrToInt(buf);
                    end;
                  if map[k, i, j]._type = 'Armes' then
                    begin
                      Readln(fichier, buf);
                      map[k, i, j].portee := StrToInt(buf);
                      Readln(fichier, buf);
                      map[k, i, j].degat := StrToInt(buf);
                    end;
                  if map[k, i, j]._type = 'Ascenceur' then
                    begin
                      Readln(fichier, buf);
                      map[k, i, j].etage := StrToInt(buf);
                    end;
                  if map[k, i, j]._type = 'Boss' then
                    begin
                      Readln(fichier, buf);
                      map[k, i, j].contenu.nom := buf;
                      Readln(fichier, buf);
                      map[k, i, j].niveau := StrToInt(buf);
                      Readln(fichier, buf);
                      map[k, i, j].script := buf;
                    end;
                  if map[k, i, j]._type = 'Carte graphique' then
                    begin
                      Readln(fichier, buf);
                      map[k, i, j].puissance := StrToInt(buf);
                    end;
                  if map[k, i, j]._type = 'Coffre' then
                    begin
                      Readln(fichier, buf);
                      map[k, i, j].contenu.nom := buf;
                    end;
                  if map[k, i, j]._type = 'Disque dur' then
                    begin
                      Readln(fichier, buf);
                      map[k, i, j].capacite := StrToInt(buf);
                    end;
                  if (map[k, i, j]._type = 'Ennemi statique')
                     or (map[k, i, j]._type = 'Ennemi dynamique')
                     or (map[k, i, j]._type = 'Kamikaze')
                     or (map[k, i, j]._type = 'Espion') then                   //           /|
                     begin                                                    //           / /
                       Readln(fichier, buf);                                 //            / /
                       map[k, i, j].contenu._type := buf;                   //             / /
                       Readln(fichier, buf);                                            // /// //
                       map[k, i, j].contenu.nom := buf;                               // //  //  //
                       Readln(fichier, buf);                                           //      //
                       map[k, i, j].contenu.carac1 := StrToInt(buf);
                       Readln(fichier, buf);
                       if buf <> '' then
                         map[k, i, j].contenu.carac2 := StrToInt(buf);
                       Readln(fichier, buf);
                       map[k, i, j].contenu.mesh := buf;
                       Readln(fichier, buf);
                       map[k, i, j].niveau := StrToInt(buf);
                       if game_type = 'c' then
                         begin
                            map[k, i, j].nom := '';
                            map[k, i, j].mesh := '';
                            map[k, i, j]._type := 'none';
                         end;
                     end;
                  if map[k, i, j]._type = 'Gentil petit asus' then
                    begin
                      Readln(fichier, buf);
                      map[k, i, j].script := buf;
                    end;
                  if map[k, i, j]._type = 'Livre' then
                    begin
                      Readln(fichier, buf);
                      map[k, i, j].text := buf;
                    end;
                  if map[k, i, j]._type = 'Piege' then
                    begin
                      Readln(fichier, buf);
                      map[k, i, j].degat := StrToInt(buf);
                    end;
                  if map[k, i, j]._type = 'Processeur' then
                    begin
                      Readln(fichier, buf);
                      map[k, i, j].vitesse := StrToInt(buf);
                    end;
                  if map[k, i, j]._type = 'Ram' then
                    begin
                      Readln(fichier, buf);
                      map[k, i, j].taille := StrToInt(buf);
                    end;
                end;
              if map[k, i, j]._type = 'none' then
                map[k, i, j].nom := buf;
            end;
    except
      On E : Exception do
        begin
          Result := false;
          writeln('i : ', i);
          Writeln('j : ', j);
          Exit;
        end;
    end;
    Result := true;
end;

function tri_map(map: t_map;
                 taillex: integer;
                 tailley: integer;
                 nbetage: integer;
                 dep_etage: integer;
                 nbrobj: integer): t_map_obj;
var
  dep_et: integer;
  k, i, j: integer;
  nbeta : integer;
  temp : t_map_obj;
//  nb_dyn: integer;
begin

  k := 0;
  nbeta := 0;
  while k <= nbetage do
    begin
      nbeta := nbeta + 1;
      SetLength(temp, nbeta);
      temp[k] := tri_etage_stat(map, k, taillex, tailley,nbrobj);
      k := k + 1;
    end;
  result := temp;
end;



//
//
//
function tri_etage_stat(map: T_Map;
                        etage: integer;
                        taillex: integer;
                        tailley: integer;
                        nbrobj: integer): T_eta_obj;
var
  occ: integer;
  nb_total_obj: integer;
  nb_sort_obj: integer;
  i, j: integer;
  temp_sort_none, temp_sort_caca: integer;
  temp_eta: T_eta_obj;
  temp1, temp2: string;
  temp_none, temp_sol, temp_caca: integer;
  temp_caca_bool, temp_none_bool: boolean;
  temp_caca_bool2, temp_none_bool2: boolean;
  temp_coor: t_coordo;
  temp_1er_caca, temp_1er_none: boolean;
begin
  nb_total_obj := 0;
  nb_sort_obj := 0;
  temp2 := map[etage, 0, 0].nom;
  temp_caca_bool := false;
  temp_none_bool := false;
  temp_caca_bool2 := false;
  temp_none_bool2 := false;
  temp_1er_caca := true;
  temp_1er_none := true;
  while nb_total_obj < taillex * tailley do
    begin
      j := 0;
      temp1 := temp2;
      occ := 0;
      nb_sort_obj := nb_sort_obj + 1;
      if (temp1 = 'none') and (temp_none_bool2 = true) then
        begin

        end
      else
        if (temp1 = 'caca') and (temp_caca_bool2 = true) then
          begin

          end
        else
          SetLength(temp_eta, nb_sort_obj);
      while j < tailley do
        begin
          i := 0;
          while i < taillex  do
            begin
              if temp1 = map[etage, i ,j].nom then
                begin
                  occ := occ + 1;
                  SetLength(temp_eta[nb_sort_obj - 1].tab_etage, occ);
                  if (map[etage, i, j]._type = 'Ennemi statique') or
                     (map[etage, i, j]._type = 'Ennemi dynamique') or
                     (map[etage, i, j]._type = 'Kamikaze') or
                     (map[etage, i, j]._type = 'Espion') or
                     (map[etage, i, j]._type = 'Gentil petit asus') or
                     (map[etage, i, j]._type = 'Boss') or
                     (map[etage, i, j]._type = 'Argent') or
                     (map[etage, i, j]._type = 'Arrivee') or
                     (map[etage, i, j]._type = 'Depart')
                       then
                         begin
                      if (i > 0) and (map[etage, i - 1, j]._type = 'Sol') then
                        begin
                          temp_sol := 1;
                          temp_coor.x := i - 1;
                          temp_coor.y := j
                        end
                      else
                        if (i < taillex - 1) and (map[etage, i + 1, j]._Type = 'Sol') then
                          begin
                            temp_sol := 1;
                            temp_coor.x := i + 1;
                            temp_coor.y := j;
                          end
                        else
                          if (j < tailley - 1) and (map[etage, i, j + 1]._Type = 'Sol') then
                            begin
                              temp_sol := 1;
                              temp_coor.x := i;
                              temp_coor.y := j + 1;
                            end
                          else
                            if ( j > 0) and (map[etage, i, j - 1]._Type = 'Sol') then
                              begin
                                temp_sol := 1;
                                temp_coor.x := i;
                                temp_coor.y := j - 1;
                              end
                            else
                              if (i < taillex) and (map[etage, i + 1, j]._Type = 'none') then
                                begin
                                  temp_sol := 0;
                                  temp_coor.x := i + 1;
                                  temp_coor.y := j;
                                end
                              else
                                if ( i > 0) and (map[etage, i - 1, j]._Type = 'none') then
                                  begin
                                    temp_sol := 0;
                                    temp_coor.x := i - 1;
                                    temp_coor.y := j;
                                  end
                                else
                                  if (j < tailley) and (map[etage, i, j + 1]._Type = 'none') then
                                    begin
                                      temp_sol := 0;
                                      temp_coor.x := i;
                                      temp_coor.y := j + 1;
                                    end
                                  else
                                    if (j > 0) and (map[etage, i, j - 1]._Type = 'none') then
                                      begin
                                        temp_sol := 0;;
                                        temp_coor.x := i;;
                                        temp_coor.y := j - 1;
                                      end;
                    case temp_sol of
                      0: begin
                           if temp_1er_none then
                            begin
                              setlength(temp_eta, temp_sort_none + 1);
                              temp_eta[temp_sort_none].objet := map[etage, temp_coor.x, temp_coor.y];
                              temp_1er_none := false;
                            end;
                           temp_none_bool2 := true;
                           SetLength(temp_eta[temp_sort_none].tab_etage, temp_none + 1);
                           temp_eta[temp_sort_none].tab_etage[temp_none].x := i;
                           temp_eta[temp_sort_none].tab_etage[temp_none].y := j;
                           temp_none := temp_none + 1;
                         end;
                      1: begin
                           if temp_1er_caca then
                             begin
                               setlength(temp_eta, temp_sort_caca + 1);
                               temp_eta[temp_sort_caca].objet := map[etage, temp_coor.x, temp_coor.y];
                               temp_1er_caca := false;
                             end;
                           temp_caca_bool2 := true;
                           SetLength(temp_eta[temp_sort_caca].tab_etage, temp_caca + 1);
                           temp_eta[temp_sort_caca].tab_etage[temp_caca].x := i;
                           temp_eta[temp_sort_caca].tab_etage[temp_caca].y := j;
                           temp_caca := temp_caca + 1;
                         end;
                    end;
                    temp_eta[nb_sort_obj - 1].objet := map[etage, i, j];
                    temp_eta[nb_sort_obj - 1].tab_etage[occ - 1].x := i;
                    temp_eta[nb_sort_obj - 1].tab_etage[occ - 1].y := j;
                    temp_eta[nb_sort_obj - 1].tab_etage[occ - 1].num := map[etage, i, j].numobj;
                         end
                  else
                    begin
                      if temp1 = 'none' then
                        begin
                          temp_1er_none := false;
                          temp_none := temp_none + 1;
                          temp_sort_none := nb_sort_obj - 1;
                          temp_none_bool := true;
                        end
                      else
                        if (temp_none_bool = false) and (temp_none_bool2 = false) then
                          temp_sort_none := nb_sort_obj;
                      if temp1 = 'caca' then
                        begin
                          temp_1er_caca := false;
                          temp_caca := temp_caca + 1;
                          temp_sort_caca := nb_sort_obj - 1;
                          temp_caca_bool := true;
                        end
                      else
                        if (temp_caca_bool = false) and (temp_caca_bool2 = false) then
                          temp_sort_caca := nb_sort_obj;
                      if (temp1 = 'none') and (temp_none_bool2 = true) then
                        begin
                          temp_eta[temp_sort_none].objet := map[etage, i, j];
                          temp_eta[temp_sort_none].tab_etage[temp_none - 1].x := i;
                          temp_eta[temp_sort_none].tab_etage[temp_none - 1].y := j;
                          temp_eta[temp_sort_none].tab_etage[temp_none - 1].num := map[etage, i, j].numobj;
                        end
                      else
                        if (temp1 = 'caca') and (temp_caca_bool2 = true) then
                          begin
                            temp_eta[temp_sort_caca].objet := map[etage, i, j];
                            temp_eta[temp_sort_caca].tab_etage[temp_caca - 1].x := i;
                            temp_eta[temp_sort_caca].tab_etage[temp_caca - 1].y := j;
                            temp_eta[temp_sort_caca].tab_etage[temp_caca - 1].num := map[etage, i, j].numobj;
                          end
                        else
                          begin
                            temp_eta[nb_sort_obj - 1].objet := map[etage, i, j];
                            temp_eta[nb_sort_obj - 1].tab_etage[occ - 1].x := i;
                            temp_eta[nb_sort_obj - 1].tab_etage[occ - 1].y := j;
                            temp_eta[nb_sort_obj - 1].tab_etage[occ - 1].num := map[etage, i, j].numobj;
                          end;
                    end;
                  nb_total_obj := nb_total_obj + 1;
                  map[etage, i, j].nom := '';
                end
              else
                if map[etage, i ,j].nom <> '' then
                    temp2 := map[etage, i ,j].nom;
              i := i + 1;
            end;
          j := j + 1;
        end;
    end;
  result := temp_eta;
end;











end.
